package cz.stv.kucera_tomas_sen.auto;
import cz.stv.kucera_tomas_jun.auto.ISměrový;
import cz.stv.pecinovsky.správceplátna.*;
import cz.stv.pecinovsky.utility.*;

/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy. */

//zkouška uploudu


/*******************************************************************************
 * Instance třídy {@code Auto4} představují ...
 *
 * @author    jméno autora
 * @version   0.00.000
 */
public class Auto4 implements IPosuvný, ISměrový, IOvládaný
{
    //== KONSTANTNÍ ATRIBUTY TŘÍDY =============================================

    private SprávcePlátna SP = SprávcePlátna.getInstance();

    //== PROMĚNNÉ ATRIBUTY TŘÍDY ===============================================
    //== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ====================
    //== KONSTANTNÍ ATRIBUTY INSTANCÍ ==========================================
    //== PROMĚNNÉ ATRIBUTY INSTANCÍ ============================================

      private IAuto1 auto1 = null;
      private Rozhodčí rozhodčí;

    //== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ====================================
    //== OSTATNÍ NESOUKROMÉ METODY TŘÍDY =======================================

    //##########################################################################
    //== KONSTRUKTORY A TOVÁRNÍ METODY =========================================

    /***************************************************************************
     *
     */
    public Auto4()
    {
        auto1 = new AutoV( 100, 100);
        //SP.přidej( auto1);
    }

    public Auto4(int x, int y)
    {
        auto1 = new AutoV( x, y);
        //SP.přidej( auto1);
    }

    //== ABSTRAKTNÍ METODY =====================================================
    //== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =================================
    //== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ====================================
        /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param kreslítko Kreslítko, které nakreslí instanci
     */
//     @Override
    public void nakresli(Kreslítko kreslítko)
    {
        auto1.nakresli(kreslítko);
    }

 public void vpred(){
    auto1.vpred( 50);
    }


  public void vzad(){
    auto1.vpred( -50);
    }

        /***************************************************************************
     * Vrátí x-ovou (vodorovnou) souřadnici pozice instance.
     *
     * @return  Aktuální vodorovná (x-ová) souřadnice instance,
     *          x=0 má levý okraj plátna, souřadnice roste doprava
     */
    //     @Override
    public int getX()
    {
        //return   auto1.getX();
        return auto1.getPozice().getX();
    }

    /***************************************************************************
     * Vrátí y-ovou (svislou) souřadnici pozice instance.
     *
     * @return  Aktuální svislá (y-ová) souřadnice instance,
     *          y=0 má horní okraj plátna, souřadnice roste dolů
     */
    //     @Override
    public int getY()
    {
        //return   auto1.getY();
        return auto1.getPozice().getY();
    }

        /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x  Nově nastavovaná vodorovná (x-ová) souřadnice instance,
     *           x=0 má levý okraj plátna, souřadnice roste doprava
     * @param y  Nově nastavovaná svislá (y-ová) souřadnice instance,
     *           y=0 má horní okraj plátna, souřadnice roste dolů
     */
    //     @Override
    public void setPozice(int x, int y)
    {
        auto1.setPozice( x, y);
        //nakresli();
        SP.překresli();
    }

     /***************************************************************************
     * Šablona metody.
     *
     * @param  x   Popis parametru
     * @return     Popis vrácené hodnoty
     * @throws Ex  Popis vyhazované výjimky
     */
    public void  vlevoVbok()
{
    //SP.odstraň( auto1);
    //SP.překresli();
    auto1 = auto1.doleva();
    SP.překresli();
}


    /***************************************************************************
     * Šablona metody.
     *
     * @param  x   Popis parametru
     * @return     Popis vrácené hodnoty
     * @throws Ex  Popis vyhazované výjimky
     */
    public void vpravoVbok()
{
    //SP.odstraň( auto1);
    //SP.překresli();
    auto1 = auto1.doprava();
    SP.překresli();
}

    /***************************************************************************
     * Vrátí instanci třídy {@code Rozměr} s aktuálními rozměry instance.
     *
     * @return   Instance třídy {@code Rozměr} s aktuálními rozměry instance
     */
//     @Override
     public Rozměr getRozměr()
     {
             return auto1.getRozměr();
    }


    /***************************************************************************
     * Nastaví nové rozměry instance.
     *
     * @param rozměr  Nově nastavovaný rozměr
     */
//     @Override
    public void setRozměr(Rozměr rozměr)
    {
            auto1.setRozměr( rozměr );
    }

        /***************************************************************************
     * Vrátí instanci třídy {@code Pozice} s aktuální pozicí instance.
     *
     * @return  Instance třídy {@code Pozice} s aktuální pozicí instance
     */
//     @Override
    public Pozice getPozice()
    {
        return auto1.getPozice();
    }

            /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param pozice   Nastavovaná pozice instance
     */
//     @Override
    public void setPozice(Pozice pozice)
    {
        auto1.setPozice( pozice);
    }

        /***************************************************************************
     * Vrátí směr, do nějž je instance natočena.
     *
     * @return Směr, do nějž je instance natočena
     */
//    @Override
    public Směr8 getSměr()
    {
        return auto1.getSměr();
    }

    /***************************************************************************
     * Natočí instanci do nového směru.
     *
     * @param směr Směr, do nějž chceme instanci natočit
     */
//    @Override
    public void setSměr(Směr8 směr)
    {
         if( směr == auto1.getSměr()) {
             return;
         }
        if( směr == Směr8.VÝCHOD) {
            auto1 = new AutoV( auto1.getPozice().getX(), auto1.getPozice().getY());
            return;
        }
                if( směr == Směr8.SEVER) {
            auto1 = new AutoS( auto1.getPozice().getX(), auto1.getPozice().getY());
            return;
        }
                if( směr == Směr8.ZÁPAD) {
            auto1 = new AutoZ( auto1.getPozice().getX(), auto1.getPozice().getY());
            return;
        }
                if( směr == Směr8.JIH) {
            auto1 = new AutoJ( auto1.getPozice().getX(), auto1.getPozice().getY());
           return;
        }
    }

        /***************************************************************************
     * Reakce na stisk klávesy se šipkou vpravo.
     */
//     @Override
    public void vpravo()
    {
        vpravoVbok();
        System.out.println( this);
    }


    /***************************************************************************
     * Reakce na stisk klávesy se šipkou vlevo.
     */
//     @Override
    public void vlevo()
    {
        vlevoVbok();
        System.out.println( this);
    }


    /***************************************************************************
     * Reakce na stisk klávesy se šipkou vzhůru.
     */
//     @Override
    public void vzhůru()
    {

        vpred();
        //System.out.println( (SP.getBšířka() - this.getX()) + " - " + (SP.getBVýška() - this.getY()));
        System.out.println( this);
        if( rozhodčí != null) {
            rozhodčí.kontrola();
        }

    }
    /***************************************************************************
     * Reakce na stisk klávesy se šipkou dolů.
     */
//     @Override
    public void dolů()
    {
        vzad();
        //System.out.println( (SP.getBšířka() - this.getX()) + " - " + (SP.getBVýška() - this.getY()));
        System.out.println( this);
        if( rozhodčí != null) {
            rozhodčí.kontrola();
        }
    }


    /***************************************************************************
     * Reakce na stisk klávesy enter.
     */
//     @Override
    public void enter()
    {

    }


    /***************************************************************************
     * Reakce na stisk mezerníku.
     */
//     @Override
    public void mezera()
    {

    }


    /***************************************************************************
     * Reakce na stisk klávesy ESC, tj. na ukončení ovládání z klávesnice.
     */
//     @Override
    public void konec()
    {

    }

        public String toString()
    {
        return this.getPozice() + " " + this.getSměr();
    }


    //== SOUKROMÉ A POMOCNÉ METODY TŘÍDY =======================================
    //== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ====================================
    //== INTERNÍ DATOVÉ TYPY ===================================================
    //== TESTOVACÍ METODY A TŘÍDY ==============================================
    //
    //     /********************************************************************
    //      * Testovací metoda.
    //      */
    //     public static void test()
    //     {
    //         Auto4 instance = new Auto4();
    //     }
    //     /** @param args Parametry příkazového řádku - nepoužívané. */
    //     public static void main(String[] args)  {  test();  }

    public void setRozhodčí(Rozhodčí r) {
        this.rozhodčí = r;
    }

    public void blikejR()
    {
        auto1.blikejR();
    }

    public void blikejL()
    {
        auto1.blikejL();
    }

    public void blikej(int krát)
    {
        Opakovač opakovač = new  Opakovač();
        IAkční akce = new IAkční() {
            @Override
            public void příkaz()
            {
                auto1.blikni();
            }
        };
        opakovač.opakuj(krát, akce);
    }

}
